//! 元组示例
//!
//! 元组是将多个值组合成一个复合类型的方式。元组中的值可以是不同的类型。
//!
//! 元组是将*多种类型的多个值组合到一个复合类型*中的一种基本方式。元组的长度是固定的：声明后，它们就无法增长或缩小.
//! 没有任何值的元组 () 是一种特殊的类型，只有一个值，也写成 ()。该类型被称为单元类型（unit type），该值被称为单元值（unit value）。如果表达式不返回任何其他值，就隐式地返回单元值.

/// 元组基础示例
///
/// 元组可以包含不同类型的值
pub fn tuple_basics() {
    // 创建一个包含字符串和数字的元组
    let tup: (i32, f64, u8) = (500, 6.4, 1);

    // 解构元组
    let (x, y, z) = tup;

    println!("元组示例:");
    println!("元组的值: {:?}", tup);
    println!("解构后的值: x={}, y={}, z={}", x, y, z);

    // 通过索引访问元组元素
    let five_hundred = tup.0;
    let six_point_four = tup.1;
    let one = tup.2;

    println!("通过索引访问: {}, {}, {}", five_hundred, six_point_four, one);

    // 除了通过模式匹配进行解构外，我们还可以使用一个句点（.）连上要访问的值的索引来直接访问元组元素
    let x = (500, 6.4, 1);
    let five_hundred = x.0;
    let six_point_four = x.1;
    let one = x.2;

    println!("通过索引直接访问: {}, {}, {}", five_hundred, six_point_four, one);
}

/// 单元元组示例
///
/// 没有值的元组 () 是一种特殊类型，只有一个值，也写成 ()
///
/// 没有任何值的元组 () 是一种特殊的类型，只有一个值，也写成 ()。该类型被称为单元类型（unit type），该值被称为单元值（unit value）。如果表达式不返回任何其他值，就隐式地返回单元值.
pub fn unit_tuple() {
    let unit: () = ();
    println!("单元元组: {:?}", unit);
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_tuple_basics() {
        tuple_basics();
    }

    #[test]
    fn test_unit_tuple() {
        unit_tuple();
    }
}
